/******************************************************************************
 * \brief	Linux共享内存Demo
 * \note	须在Linux环境下编译，在MSYS2/MINGW环境下也会报错
 * \note	File format: UTF-8, 中文编码：UTF-8
 * \remarks	参考网址：[LINUX共享内存的创建与使用](https://blog.csdn.net/zzzAzl/article/details/122468102)
 * \author	将狼才鲸
 * \date	2023-03-05
 ******************************************************************************/

#include <stdio.h>		/* printf */
#include <sys/types.h>	/* key_t NULL */
#include "test_sharememory_comm.h"

#define SHM_PATH "./"	/* SHARE_MEMORY_PATH */
#define SHM_PROJECT_ID 1

static int get_sharememory_id(int size, int flag)
{
	/* 获取共享内存虚拟文件的标识号，参数一是路径名，参数二0~255自己取 */
	key_t key = ftok(SHM_PATH, SHM_PROJECT_ID);
	if (key < 0) {
		printf("get key error\n");
		return -1;
	}

	int id = shmget(key, size, flag);	/* 用指定权限为共享内存分配指定长度的连续空间 */
	if (id < 0) {
		printf("get id error\n");
		return -1;
	}

	return id;
}
 
int create_sharememory(int size)
{
	/* 创建共享内存并返回标识号，如果共享内存不存在则创建，
	   如果存在则报错，用户、组用户和其它用户具有读写权限 */
	return get_sharememory_id(size, IPC_CREAT | IPC_EXCL | 0666);
}

int get_sharememory(void)
{
	/* 获取共享内存标识号，如果共享内存不存在则创建，
	   如果存在返回该共享内存，用户、组用户和其它用户具有读写权限 */
	return get_sharememory_id(0, IPC_CREAT | 0666);
}

int destroy_sharememory(int id)
{
	/* 销毁共享内存 */
	return shmctl(id, IPC_RMID, NULL);
}
